#include <iostream>
#include <cstring>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <vector>
using namespace std;

int tickets = 1000;

class threadDate
{
public:
    threadDate(int i)
    {
        _threadname = "thread-" + to_string(i);
    }

public:
    string _threadname;
};

void* getTicket(void *args)
{
    threadDate *td = static_cast<threadDate*>(args); 
    const char *name = td->_threadname.c_str();
    while (true)
    {
        if(tickets > 0)
        {
            usleep(1000);
            printf("who=%s, get a ticket: %d\n", name, tickets); // ?
            tickets--;
        }
        else
            break;
    }
    printf("%s ... quit\n", name);
    return nullptr;
}

int main()
{
    vector<pthread_t> tids;
    vector<threadDate*> tds;
    for (int i = 0; i < 10; i++)
    {
        pthread_t tid;
        threadDate *td = new threadDate(i);
        tds.push_back(td);
        pthread_create(&tid,nullptr,getTicket,td);
        tids.push_back(tid);
    }

    for(auto& tid:tids)
    {
        pthread_join(tid,nullptr);
    }

    for(auto td:tds)
    {
        delete td;
    }

    return 0;
}

// struct ThreadDate
// {
//     string threadname;
// };

// void InitThreadDate(ThreadDate *td, int i)
// {
//     td->threadname = "thread-" + to_string(i);
// }

// string toHex(pthread_t tid)
// {
//     char buffer[128];
//     snprintf(buffer,sizeof(buffer),"0x%x",tid);
//     return buffer;
// }

// void *threadRoutine(void *args)
// {
//     ThreadDate *td = static_cast<ThreadDate *>(args);
//     int i = 0;
//   //  while (i < 10)
//  //   {
//         cout << "pid: " << getpid() << ", tid : "
//         << toHex(pthread_self()) << ", threadname: " << td->threadname<<endl;
//         // sleep(1);
//  //       i++;
//  //   }
//     delete td;
//     return nullptr;
// }

// int main()
// {
//     vector<pthread_t> tids;
//     for (int i = 1; i <= 10; i++)
//     {
//         pthread_t tid;
//         ThreadDate *td = new ThreadDate;
//         InitThreadDate(td, i);
//         sleep(1);
//         pthread_create(&tid, nullptr, threadRoutine, td);
//         tids.push_back(tid);
//     }

//     for (int i = 0; i < tids.size(); i++)
//     {
//         int n = pthread_join(tids[i], nullptr);
//         //printf("n = %d, who = 0x%x, why: %s\n", n, tids[i], strerror(n));
//     }

//     return 0;
// }